Support pathnames for --subpath=...
authorAlexander Larsson <alexl@redhat.com>
Thu, 7 Apr 2016 15:03:08 +0000 (17:03 +0200)
committerColin Walters (automation) <walters+githubbot@verbum.org>
Thu, 7 Apr 2016 15:15:39 +0000 (15:15 +0000)
This allows you to pull a single file, rather than just a directory.

Closes: #244
Approved by: cgwalters

src/libostree/ostree-repo-pull.c
tests/test-pull-subpath.sh

index 4d8b61385cbc5df7087695fb8fbed1f8c910a124..a6272b17306673c43f7d116526284587072e6345 100644 (file)
@@ -448,12 +448,7 @@ scan_dirtree_object (OtPullData   *pull_data,
   files_variant = g_variant_get_child_value (tree, 0);
   dirs_variant = g_variant_get_child_value (tree, 1);
 
-  /* Skip files if we're traversing a request only directory */
-  if (pull_data->dir)
-    n = 0;
-  else
-    n = g_variant_n_children (files_variant);
-
+  n = g_variant_n_children (files_variant);
   for (i = 0; i < n; i++)
     {
       const char *filename;
@@ -466,6 +461,14 @@ scan_dirtree_object (OtPullData   *pull_data,
       if (!ot_util_filename_validate (filename, error))
         goto out;
 
+      /* Skip files if we're traversing a request only directory, unless it exactly
+       * matches the path */
+      if (pull_data->dir &&
+          /* Should always an initial slash, we assert it in scan_dirtree_object */
+          pull_data->dir[0] == '/' &&
+          strcmp (pull_data->dir+1, filename) != 0)
+        continue;
+
       file_checksum = ostree_checksum_from_bytes_v (csum);
 
       if (!ostree_repo_has_object (pull_data->repo, OSTREE_OBJECT_TYPE_FILE, file_checksum,
index 8d20341e52f5b06a6f6b8cbe8d95fa662055fabe..b0bf4839bf4862af3d49a652e97d4a41f2c4c5ef 100755 (executable)
@@ -44,6 +44,10 @@ assert_file_has_content err.txt "Couldn't find file object"
 rev=$(${CMD_PREFIX} ostree --repo=repo rev-parse origin:main)
 assert_has_file repo/state/${rev}.commitpartial
 
+# Test pulling a file, not a dir
+${CMD_PREFIX} ostree --repo=repo pull --subpath=/firstfile origin main
+${CMD_PREFIX} ostree --repo=repo ls origin:main /firstfile
+
 ${CMD_PREFIX} ostree --repo=repo pull origin main
 assert_not_has_file repo/state/${rev}.commitpartial
 ${CMD_PREFIX} ostree --repo=repo fsck